<?xml version="1.0" encoding="UTF-8"?>
<!-- File: feature.xsd  -->
<schema targetNamespace="http://www.opengis.net/gml" 
        xmlns:gml="http://www.opengis.net/gml" 
        xmlns="http://www.w3.org/2001/XMLSchema" 
        elementFormDefault="qualified" 
        version="2.06">

  <annotation>
    <appinfo>feature.xsd v2.06 2001-02</appinfo>
    <documentation xml:lang="en">
      GML Feature schema. Copyright (c) 2001 OGC, All Rights Reserved.
    </documentation>
  </annotation>

  <!-- include constructs from the GML Geometry schema -->
  <include schemaLocation="geometry.xsd"/>

  <!-- ==============================================================
       global declarations
  =================================================================== -->

  <element name="_Feature" type="gml:AbstractFeatureType" abstract="true"/>
  <element name="_FeatureCollection" type="gml:AbstractFeatureCollectionType" 
    abstract="true" substitutionGroup="gml:_Feature"/>
  <element name="featureMember" type="gml:FeatureAssociationType"/>

  <!-- some basic geometric properties of features -->
  <element name="_geometryProperty" type="gml:GeometryPropertyType" abstract="true"/>
  <element name="geometryProperty" type="gml:GeometryPropertyType" />
  <element name="boundedBy" type="gml:BoundingShapeType"/>
  
  <element name="pointProperty" type="gml:PointPropertyType" 
    substitutionGroup="gml:_geometryProperty"/>
  <element name="polygonProperty" type="gml:PolygonPropertyType" 
    substitutionGroup="gml:_geometryProperty"/>
  <element name="lineStringProperty" type="gml:LineStringPropertyType" 
    substitutionGroup="gml:_geometryProperty"/>
  <element name="multiPointProperty" type="gml:MultiPointPropertyType" 
    substitutionGroup="gml:_geometryProperty"/>
  <element name="multiLineStringProperty" type="gml:MultiLineStringPropertyType" 
    substitutionGroup="gml:_geometryProperty"/>
  <element name="multiPolygonProperty" type="gml:MultiPolygonPropertyType" 
    substitutionGroup="gml:_geometryProperty"/>
  <element name="multiGeometryProperty" type="gml:MultiGeometryPropertyType" 
    substitutionGroup="gml:_geometryProperty"/>

  <!-- common aliases for geometry properties -->
  <element name="location" type="gml:PointPropertyType" 
    substitutionGroup="gml:pointProperty"/>
  <element name="centerOf" type="gml:PointPropertyType" 
    substitutionGroup="gml:pointProperty"/>
  <element name="position" type="gml:PointPropertyType" 
    substitutionGroup="gml:pointProperty"/>
  <element name="extentOf" type="gml:PolygonPropertyType" 
    substitutionGroup="gml:polygonProperty"/>
  <element name="coverage" type="gml:PolygonPropertyType" 
    substitutionGroup="gml:polygonProperty"/>
  <element name="edgeOf" type="gml:LineStringPropertyType" 
    substitutionGroup="gml:lineStringProperty"/>
  <element name="centerLineOf" type="gml:LineStringPropertyType" 
    substitutionGroup="gml:lineStringProperty"/>
  <element name="multiLocation" type="gml:MultiPointPropertyType" 
    substitutionGroup="gml:multiPointProperty"/>
  <element name="multiCenterOf" type="gml:MultiPointPropertyType" 
    substitutionGroup="gml:multiPointProperty"/>
  <element name="multiPosition" type="gml:MultiPointPropertyType" 
    substitutionGroup="gml:multiPointProperty"/>
  <element name="multiCenterLineOf" type="gml:MultiLineStringPropertyType" 
    substitutionGroup="gml:multiLineStringProperty"/>
  <element name="multiEdgeOf" type="gml:MultiLineStringPropertyType" 
    substitutionGroup="gml:multiLineStringProperty"/>
  <element name="multiCoverage" type="gml:MultiPolygonPropertyType" 
    substitutionGroup="gml:multiPolygonProperty"/>
  <element name="multiExtentOf" type="gml:MultiPolygonPropertyType" 
    substitutionGroup="gml:multiPolygonProperty"/>

  <!-- common feature descriptors -->
  <element name="description" type="string"/>
  <element name="name" type="string"/>

  <!-- ==============================================================
       abstract supertypes
  =================================================================== -->

  <complexType name="AbstractFeatureType" abstract="true">
    <annotation>
      <documentation>
        An abstract feature provides a set of common properties. A concrete 
        feature type must derive from this type and specify additional 
        properties in an application schema. A feature may optionally 
        possess an identifying attribute ('fid').
      </documentation>
    </annotation>
    <sequence>
      <element ref="gml:description" minOccurs="0"/>
      <element ref="gml:name" minOccurs="0"/>
      <element ref="gml:boundedBy" minOccurs="0"/>
      <!-- additional properties must be specified in an application schema -->
    </sequence>
    <attribute name="fid" type="ID" use="optional"/>
  </complexType>

  <complexType name="AbstractFeatureCollectionBaseType" abstract="true">
    <annotation>
      <documentation>
        This abstract base type just makes the boundedBy element mandatory 
        for a feature collection.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:AbstractFeatureType">
        <sequence>
          <element ref="gml:description" minOccurs="0"/>
          <element ref="gml:name" minOccurs="0"/>
          <element ref="gml:boundedBy"/>
        </sequence>
        <attribute name="fid" type="ID" use="optional"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="AbstractFeatureCollectionType" abstract="true">
    <annotation>
      <documentation>
        A feature collection contains zero or more featureMember elements.
      </documentation>
    </annotation>
    <complexContent>
      <extension base="gml:AbstractFeatureCollectionBaseType">
        <sequence>
          <element ref="gml:featureMember" minOccurs="0" maxOccurs="unbounded"/>
        </sequence>
      </extension>
    </complexContent>
  </complexType>

  <complexType name="GeometryPropertyType">
    <annotation>
      <documentation>
        A simple geometry property encapsulates a geometry element.
        Alternatively, it can function as a pointer (simple-type link) 
        that refers to a remote geometry element.
      </documentation>
    </annotation>
    <sequence minOccurs="0">
      <element ref="gml:_Geometry"/>
    </sequence>
    <attributeGroup ref="gml:AssociationAttributeGroup"/>
  </complexType>

  <complexType name="FeatureAssociationType">
    <annotation>
      <documentation>
        An instance of this type (e.g. a featureMember) can either 
        enclose or point to a feature (or feature collection); this 
        type can be restricted in an application schema to allow only 
        specified features as valid participants in the association. 
        When serving as a simple link that references a remote feature 
        instance, the value of the gml:remoteSchema attribute can be 
        used to locate a schema fragment that constrains the target 
        instance.
      </documentation>
    </annotation>
    <sequence minOccurs="0">
      <element ref="gml:_Feature"/>
    </sequence>
    <attributeGroup ref="gml:AssociationAttributeGroup"/>
  </complexType>

  <complexType name="BoundingShapeType">
    <annotation>
      <documentation>
        Bounding shapes--a Box or a null element are currently allowed.
      </documentation>
    </annotation>
    <sequence>
      <choice>
        <element ref="gml:Box"/>
        <element name="null" type="gml:NullType" />
      </choice>
    </sequence>
  </complexType>

  <!-- ==============================================================
       geometry properties
  =================================================================== -->

  <complexType name="PointPropertyType">
    <annotation>
      <documentation>
        Encapsulates a single point to represent position, location, or 
        centerOf properties.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:Point"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="PolygonPropertyType">
    <annotation>
      <documentation>
        Encapsulates a single polygon to represent coverage or extentOf 
        properties.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:Polygon"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="LineStringPropertyType">
    <annotation>
      <documentation>
        Encapsulates a single LineString to represent centerLineOf or 
        edgeOf properties.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:LineString"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="MultiPointPropertyType">
    <annotation>
      <documentation>
        Encapsulates a MultiPoint element to represent the following 
        discontiguous geometric properties: multiLocation, multiPosition, 
        multiCenterOf.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:MultiPoint"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="MultiLineStringPropertyType">
    <annotation>
      <documentation>
        Encapsulates a MultiLineString element to represent the following 
        discontiguous geometric properties: multiEdgeOf, multiCenterLineOf.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:MultiLineString"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="MultiPolygonPropertyType">
    <annotation>
      <documentation>
        Encapsulates a MultiPolygon to represent the following discontiguous 
        geometric properties: multiCoverage, multiExtentOf.
      </documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:MultiPolygon"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <complexType name="MultiGeometryPropertyType">
    <annotation>
      <documentation>Encapsulates a MultiGeometry element.</documentation>
    </annotation>
    <complexContent>
      <restriction base="gml:GeometryPropertyType">
        <sequence minOccurs="0">
          <element ref="gml:MultiGeometry"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
      </restriction>
    </complexContent>
  </complexType>

  <simpleType name="NullType">
    <annotation>
      <documentation>
        If a bounding shape is not provided for a feature collection, 
        explain why. Allowable values are:
        innapplicable - the features do not have geometry
        unknown - the boundingBox cannot be computed
        unavailable - there may be a boundingBox but it is not divulged
        missing - there are no features
      </documentation>
    </annotation>
    <restriction base="string">
      <enumeration value="inapplicable"/>
      <enumeration value="unknown"/>
      <enumeration value="unavailable"/>
      <enumeration value="missing"/>
    </restriction>
  </simpleType>
</schema>
